\chapter{L'analyse syntaxique}

\section{Les diagrammes de Conway}
Pour décrire la grammaire d'une langue naturelle, on utilise parfois des schémas (et le plus souvent des règles). Les langages de programmation ont une structure à la fois plus simple et plus stricte que les langues naturelles. Ils se prêtent donc mieux à la représentation par règles de production et diagrammes syntaxiques. 
Les diagrammes de Conway permettent de représenter de façon claire et simple les différents segments que compose le langage Pascal. Pour faciliter la programmation en C de l’analyseur « syntaxic » nous avons procédé à une conception minutieuse de chaque diagramme, en exploitant l’outil de création de diagramme appelé « DIA ».
Un diagramme correspond à des traitements spécifiques ou bien à des conditions survenant fréquemment. 
Parmi les 4 composantes fondamentales qui constituent le langage, nous pouvons citer :
\begin{itemize}
	\item	les déclarations (de constantes, types, variables, fonctions, procédures, paramètres, etc.) ; 
	\item	les accès aux variables (notation pointée, accès à un tableau, etc.). 
	\item	les expressions (arithmétiques ou logiques) ; 
	\item	les instructions (affectation, conditionnelles, boucles, etc.) ; 
\end{itemize}
Chaque sous-segment d’une de ces 4 composantes se caractérise par une fonction qui parfois contient une autre sous-fonction.
En procédant de la sorte, nous avons voulu minimiser au maximum le nombre de lignes de codes, en factorisant chaque opération redondante. Nous avons également souhaité identifier de manière précise les cas particuliers liés à l’implémentation des diagrammes

\section{Les cas particuliers}
\begin{itemize}
	\item Cas 1 : Se produit à la sortie de l’appel d’une fonction qui possède un traitement conditionnel permettant l'insertion d’unités lexicales optionnelles ou bien d’aucune. Cette lecture de contrôle engendre un décalage à la sortie de l'appel de la fonction. De ce fait, il ne faut pas appeler yylex() pour effectuer le traitement suivant.
	\item Cas 2 : Même principe que le cas 1, sauf que c’est à l’intérieur même de la fonction qu’on évite de faire une lecture, afin d’éviter les décalages.
	\item Cas 3 : Quand il y a plusieurs branches possibles et qu'une l'une d'entre elles aboutie à une lecture d'avance, les autres branches doivent effectuer une lecture dans le vide pour ne pas décaler d’un lexème, l’analyse du programme.
\end{itemize}
\section{Les unités lexicales (lexème)}
L’analyseur lexical yylex se repose sur l’interprétation d’unité lexicale pour valider des ensembles d’instructions. De ce fait, il a fallu regrouper l’ensemble des caractères ou ensemble de caractères ayant une fonction connexe, dans des unités lexicales.
Le regroupement et l’identification de ces instructions récurrentes s’est fait en utilisant des expressions régulières. Elles sont consignées dans le fichier nommé « analex.l ».
Parmi les unités lexicales que l’on trouve, nous distinguons les :
\begin{itemize}
	\item Constantes :
	\begin{itemize}
		\item	Entières : 10, -50
		\item	Réelles : 3.57987
		\item	Booléennes : true ou false
		\item	Chaines : $'une_chaine$'
		\item	De caractères : ‘A’
	\end{itemize}
		\item Commentaires {} ou bien {* *}
		\item Identificateurs
		\item Séparateurs : , ; ( )
		\item Opérateurs
	\begin{itemize}
		\item Arithmétiques : * / + -
		\item Interne
		\item D’affectation : :=
		\item Booléens : == <= >= <>
	\end{itemize}
\end{itemize}

Chacune de ces unités sera analysée et exploitée dans les fonctions de l’analyseur syntaxique, afin de contrôler la conformité d’un programme Pascal.

\section{L'analyseur lexicale}
Ce fichier C fait appel à l’analyseur lexicale yylex qui se basera sur les lexèmes définis dans « analex.l ». Il se caractérise principalement par la retranscription d’un diagramme de Conway sous forme de fonction renvoyant un booléen.
Les fonctions
Afin de faciliter notre travail et alléger les traitements, nous avons conçu des fonctions de test des unités lexicales ou de chaines spécifiques.
\textbf{$Lex_type$}
Permets de savoir si le lexème courant correspond à l’une des unités lexicales définies dans « analex.l »
\textbf{$Lex_char$}
Permet de savoir si l’unité lexicale courante correspond à un caractère ou une chaine de caractère spécifique, le plus généralement un mot clé.

\section{L'analyseur sémantique}

A défaut de l'analyseur syntaxique qui se penche uniquement sur la structure et la forme des instructions contenues dans un programme Pascal, l'analyseur sémantique se focalise sur le fond et le contenu des variables.
En effet, son rôle est :
\begin{itemize}
  \item Contrôler que le nom des variables employées dans les instructions du code (affectation, boucles, conditionnelles...) existent;
  \item Contrôler que les affectations concernant une variable soient en adéquation avec son type;
  \item Contrôler la cohérence des opérations sur les variables;
\end{itemize}
Opérations autorisées :

\begin{itemize}
  \item \textbf{int} avec \textbf{int} 
  \item \textbf{int} avec \textbf{double} 
  \item \textbf{double} avec \textbf{int} 
  \item \textbf{double} avec \textbf{double} 
  \item \textbf{bool} avec \textbf{bool}
  \item \textbf{string} avec \textbf{string}
  \item \textbf{string} avec \textbf{char}
  \item \textbf{char} avec \textbf{char}
\end{itemize}